//
// Created by MI T on 2024/8/1.
//

#ifndef UVCCAMERA_UVCCAMERA_H
#define UVCCAMERA_UVCCAMERA_H
#include "UvcPreview.h"
#include "libuvc/libuvc_internal.h"
#include <utility> // for std::pair

typedef struct control_value {
    int min;
    int max;
} control_value_t;

class UvcCamera {
private:
    uvc_context_t *mContext;
    uvc_device_handle_t *mDeviceHandle;
    uvc_device_t *mDevice;
    UvcPreview *mPreview;
    int mFd;
// 获取可使用的分辨率对应类型
    int getFormatType(uint8_t descriptorSubtype);

public:
    UvcCamera(); // 初始化

    ~UvcCamera(); // 数据销毁

    int connect(int vId, int pId, int busNum, int devAddress); // 连接设备

    int connectFd(int fd, int busNum, int devAddress); // 连接设备

    int disConnect(); // 断开连接释放内存

    int setPreviewSize(int width, int height, int format); // 设置预览分辨率

    int setDisplaySurface(char *surfaceId); // 设置预览控件

    int startPreview(); // 开启预览

    int stopPreview(); // 停止预览

    int getPreviewWidth();
    int getPreviewHeight();

    int loadCurrentFormat();

    char *getSupportedPreviewSizes(); // 获取分辨率集合

    int getParameterIntValue(int type); // 获取参数信息-int类型值

    bool setParameterIntValue(int type, int value);

    std::pair<int, int> getParameterRange(int type);

    void setPreviewDataListener(napi_env env, napi_value value, int mode);
};


#endif // UVCCAMERA_UVCCAMERA_H
